﻿using System;
using System.Collections.Generic;
using System.Text;
using CeA.Reports.Atendimento.DataAccess.Criteria;
using CeA.Reports.Atendimento.DataAccess.DTO;
using CeA.Reports.Atendimento.DataAccess.DAO;
using CeA.Reports.Atendimento.DataAccess;
using CeA.Reports.Atendimento.DataAccess.DAO.Oracle;
using CeA.Reports.Atendimento.DataAccess.Model;

namespace Qtech.Reports.Atendimento.Services {
    public static class CadastroFacade {
        private static DAOFactory factory = DAOFactory.GetDAOFactory(DAOFactoryType.ORACLE);


        /// <summary>
        /// Static Initializes the <see cref="CadastroFacade"/> class.
        /// </summary>
        static CadastroFacade() { }


        #region -- RFS Domain -------------------------------------------------

        public static List<RfsDTO> FindRfs(RfsCriteria criteria) {
            Rfs dao = factory.GetRfsDAO();
            return dao.ListarIdentificacao(criteria);
        }


        public static RfsDTO SaveRfs(RfsDTO rfs) {
            Rfs dao = factory.GetRfsDAO();
            return dao.Salvar(rfs);
        }


        public static void UpdateRfs(RfsDTO rfs) {
            Rfs dao = factory.GetRfsDAO();
            dao.Atualizar(rfs);
        }


        public static void RemoveRfs(int id) {
            Rfs dao = factory.GetRfsDAO();
            dao.Excluir(id);
        }

        #endregion


        #region -- Regiao Domain ----------------------------------------------

        public static List<RegiaoDTO> FindRegiao(RegiaoCriteria criteria) {
            Regiao dao = factory.GetRegiaoDAO();
            return dao.ListarIdentificacao(criteria);
        }


        public static RegiaoDTO SaveRegiao(RegiaoDTO regiao) {
            Regiao dao = factory.GetRegiaoDAO();
            return dao.Salvar(regiao);
        }


        public static void UpdateRegiao(RegiaoDTO regiao) {
            Regiao dao = factory.GetRegiaoDAO();
            dao.Atualizar(regiao);
        }

        public static void ChangePosition(int idSobe, int idDesce)
        {
            Regiao dao = factory.GetRegiaoDAO();
            dao.AlterarPosicao(idSobe, idDesce);
        }

        public static void RemoveRegiao(int id) {
            Regiao dao = factory.GetRegiaoDAO();
            dao.Excluir(id);
        }

        #endregion


        #region -- Especialista Domain ----------------------------------------

        public static List<EspecialistaDTO> FindEspecialista(EspecialistaCriteria criteria) {
            Especialista dao = factory.GetEspecialistaDAO();
            return dao.ListarIdentificacao(criteria);
        }


        public static EspecialistaDTO SaveEspecilista(EspecialistaDTO especialista) {
            Especialista dao = factory.GetEspecialistaDAO();
            return dao.Salvar(especialista);
        }


        public static void UpdateEspecialista(EspecialistaDTO especialista) {
            Especialista dao = factory.GetEspecialistaDAO();
            dao.Atualizar(especialista);
        }


        public static void RemoveEspecialista(int id) {
            Especialista dao = factory.GetEspecialistaDAO();
            dao.Excluir(id);
        }

        #endregion


        #region -- Loja Domain ------------------------------------------------
        public static LojaDTO GetLoja(int id) {
            Loja dao = factory.GetLojaDAO();
            return dao.Recuperar(id);
        }


        public static List<IdentificacaoLojaDTO> FindLoja(LojaCriteria criteria) {
            Loja dao = factory.GetLojaDAO();
            return dao.ListarIdentificacao(criteria);
        }


        public static List<LojaDTO> FindLojaDetalhe(LojaCriteria criteria) {
            Loja dao = factory.GetLojaDAO();
            return dao.Listar(criteria);
        }


        public static LojaDTO SaveLoja(LojaDTO loja) {
            Loja dao = factory.GetLojaDAO();
            return dao.Salvar(loja);
        }


        public static void UpdateLoja(LojaDTO loja) {
            Loja dao = factory.GetLojaDAO();
            dao.Atualizar(loja);
        }


        public static void RemoveLoja(int id) {
            Loja dao = factory.GetLojaDAO();
            dao.Excluir(id, dao.Recuperar(id).QmaticInfo.BranchNumber);
        }

        #endregion


        #region -- Usuario Domain ---------------------------------------------

        public static List<UsuarioDTO> FindUsuario(UsuarioCriteria criteria) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.Listar(criteria);
        }


        public static UsuarioDTO GetUsuarioAuth(LoginDTO login) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.Autenticar(login);
        }


        public static UsuarioDTO GetUsuario(int id) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.Recuperar(id);
        }


        public static UsuarioDTO GetUsuario(string login) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.Recuperar(login);
        }


        public static List<RoleDTO> FindRoles() {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.RecuperarRoles();
        }


        public static List<RoleDTO> GetUsuarioRoles(int id) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.RecuperarRoles(id);
        }


        public static List<RoleDTO> GetUsuarioRoles(string login) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.RecuperarRoles(login);
        }


        public static UsuarioDTO SaveUsuario(UsuarioDTO usuario) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.Salvar(usuario);
        }


        public static UsuarioDTO UpdateUsuario(UsuarioDTO usuario) {
            Usuario dao = factory.GetUsuarioDAO();
            return dao.Atualizar(usuario);
        }


        public static void RemoveUsuario(int id) {
            Usuario dao = factory.GetUsuarioDAO();
            dao.Desativar(id);
        }

        #endregion


        #region -- Dia Domain -------------------------------------------------

        public static List<DiaDTO> FindDia(DiaCriteria criteria) {
            Dia dao = factory.GetDiaDAO();
            return dao.ListarIdentificacao(criteria);
        }


        public static List<DiaPicoDTO> FindDiaPico(DiaCriteria criteria) {
            Dia dao = factory.GetDiaDAO();
            return dao.ListarDiaPico(criteria);
        }


        public static DiaDTO SaveDia(DiaDTO dia) {
            Dia dao = factory.GetDiaDAO();
            return dao.Salvar(dia);
        }


        public static void UpdateDia(DiaDTO dia) {
            Dia dao = factory.GetDiaDAO();
            dao.Atualizar(dia);
        }


        public static void UpdateDiaPico(DiaPicoDTO dia) {
            Dia dao = factory.GetDiaDAO();
            dao.AtualizarDiaPico(dia);
        }


        public static void RemoveDia(int id) {
            Dia dao = factory.GetDiaDAO();
            dao.Excluir(id);
        }

        #endregion


        #region -- Hora Domain ------------------------------------------------
        public static HoraDTO GetHora(int id) {
            Hora dao = factory.GetHoraDAO();
            return dao.Recuperar(id);
        }

        public static List<HoraDTO> FindHora() {
            Hora dao = factory.GetHoraDAO();
            return dao.ListarIdentificacao();
        }

        #endregion


        #region -- Planejamento Domain ----------------------------------------
        public static List<PlanejamentoDTO> FindPlanejamento(PlanejamentoCriteria criteria) {
            Planejamento dao = factory.GetPlanejamentoDAO();
            return dao.ListarIdentificacao(criteria);
        }

        public static void CarregarEstatistica(PlanejamentoCriteria criteria) {
            Planejamento dao = factory.GetPlanejamentoDAO();
            dao.CarregarEstatistica(criteria);
        }


        public static void UpdatePlanejamento(PlanejamentoDTO planejamento) {
            Planejamento dao = factory.GetPlanejamentoDAO();
            dao.Atualizar(planejamento);
        }


        public static void RemovePlanejamento(PlanejamentoCriteria criteria) {
            Planejamento dao = factory.GetPlanejamentoDAO();
            dao.Excluir(criteria);
        }


        #endregion


        #region -- Servico Domain ---------------------------------------------
        
        public static ServicoDTO GetServico(int id) {
            Servico dao = factory.GetServicoDAO();
            return dao.Recuperar(id);
        }

        /// <summary>
        /// Localiza todos os serviçoes cadastrados no sistema..
        /// </summary>
        /// <returns></returns>
        public static List<ServicoDTO> FindServico() {
            Servico dao = factory.GetServicoDAO();
            return dao.ListarIdentificacao();
        }
        
        /// <summary>
        /// Gera o Relatório de Serviçoos de acordo com o filtro informado.
        /// </summary>
        /// <param name="filter">Filtro para os dados do relatório.</param>
        /// <returns></returns>
        public static RelatorioServicoDTO FindServicoReportBy(RelatorioServicoFilter filter) {
            RelatorioServico dao = factory.GetRelatorioServicoDAO();
            return dao.FindRelatorioServicoBy(filter);
        }

        /// <summary>
        /// Gera o Relatório de Serviços de acordo com o filtro informado para linha RFS
        /// </summary>
        /// <param name="filter">Filtro para os dados do relatório.</param>
        /// <returns></returns>
        public static RelatorioServicoDTO FindServicoReportByRFS(RelatorioServicoFilter filter)
        {
            RelatorioServico dao = factory.GetRelatorioServicoDAO();
            return dao.FindRelatorioServicoByRFS(filter);
        }


        /// <summary>
        /// Gera o Relatório de Serviçoos de acordo com o filtro informado para linha Brasil
        /// </summary>
        /// <param name="filter">Filtro para os dados do relatório.</param>
        /// <returns></returns>
        public static RelatorioServicoDTO FindServicoReportByBrasil(RelatorioServicoFilter filter)
        {
            RelatorioServico dao = factory.GetRelatorioServicoDAO();
            return dao.FindRelatorioServicoByBrasil(filter);
        }

        #endregion


        #region -- Ranking Domain ---------------------------------------------

        public static List<RelatorioRankingDTO> FindReportRankingLojaBy(RankingFilter filter) {
            RelatorioRanking dao = factory.GetRelatorioRankingDAO();
            return dao.FindRankingLojaBy(filter);
        }

        public static List<RelatorioRankingDTO> FindReportRankingLojaRfsBy(RankingFilter filter) {
            RelatorioRanking dao = factory.GetRelatorioRankingDAO();
            return dao.FindRankingLojaRfsBy(filter);
        }

        public static RelatorioRankingDTO FindReportRankingConsolidadoBy(RankingFilter filter) {
            RelatorioRanking dao = factory.GetRelatorioRankingDAO();
            return dao.FindRankingLojaConsolidadoBy(filter);
        }

        public static List<RelatorioRankingDTO> FindReportRankingEspecialistaBy(RankingFilter filter) {
            RelatorioRanking dao = factory.GetRelatorioRankingDAO();
            return dao.FindRankingEspecialistaBy(filter);
        }
        
        #endregion
    }
}
